package zju.dgm.service.dataservice;

import zju.dgm.dto.DFFilter;
import zju.dgm.dto.DataFrame;
import zju.dgm.dto.MessageFrame;
import zju.dgm.dto.ServerInfo;

import javax.xml.crypto.Data;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.Future;
import java.util.concurrent.locks.Condition;
import java.util.function.Function;

public interface DataUtilProvider {


    /**
     * 向指定server发送数据
     *
     * @param info 指定server的信息
     * @param df   要发送的数据,应当事先封装成DataFrame
     * @throws Exception
     */
    void sendData(ServerInfo info, DataFrame df) throws Exception;

    /**
     * 阻塞在语句上，直到Data端获得了一个DF，并且能通过过滤器的过滤，返回之，如果超时返回null
     *
     * @return  合法的数据帧，经过深拷贝，可修改
     * @throws Exception 等待过程中被阻塞则抛出异常
     */
    DataFrame blockingGetOneDF(DFFilter filter, int millisTimeOut) throws Exception;



    /**
     * 阻塞在语句上，直到Data端获得了一个DF，返回之,如果超时返回null
     *
     * @param millisTimeOut
     * @return
     * @throws Exception 等待过程中被阻塞则抛出异常
     */
    DataFrame blockingGetOneDF(int millisTimeOut) throws Exception;
    /*
     示例
        blockingGetOneDF(new DFFilter() {
               @Override
               public boolean isWanted(DataFrame df) {
                   return df!=null&&df.getSender()!=null&&df.getData()!=null;
               }
           },1000);

           等价于

           blockingGetOneDF(df -> df!=null&&df.getSender()!=null&&df.getData()!=null,1000);
     */



}
